package JUC;
// 不同的线程处理不同的业务
public class TestSynchronized {
    public static void main(String[] args) throws InterruptedException {
        Data1 data1 = new Data1();
        new Thread(() -> {
            try {
                for (int i =0;i<10;i++){
                    data1.increase();
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }, "A").start();
        new Thread(() -> {
            try {
                for (int i =0;i<10;i++){
                    data1.decrease();
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }, "B").start();
    }
}
// 资源类
// synchronized模拟生产者消费者问题：等待、业务、通知三个流程
class Data1 {
    private int number = 0;
    public void increase() throws InterruptedException {
        synchronized (this){
            System.out.println(Thread.currentThread().getName()+"：我拿到对象锁了,开始执行同步代码块");
            // 用while而不用if判断是防止虚假唤醒问题
            while (number != 0){
                System.out.println("我正在执行number != 0这段代码");
                // 当 number != 0线程进入等待状态,并把锁释放
                System.out.println(Thread.currentThread().getName()+"：我正在执行wait（）方法，并且释放了锁");
                wait();
            }
            // 能进到这里说明number不等于0,number++后等于0
            number++;
            System.out.println("number + 1了,现在number的值是"+number);
            // 唤醒其他全部线程,告诉其他线程我加一了
            notifyAll();

            System.out.println(Thread.currentThread().getName()+" -> " + number);
            System.out.println("increase()同步代码块走完了");
        }

    }
    public void decrease() throws InterruptedException {
        synchronized (this){
            System.out.println(Thread.currentThread().getName()+"：我拿到对象锁了,开始执行同步代码块");
            // 用while而不用if判断是防止虚假唤醒问题
            while (number == 0){
                System.out.println("我正在执行number == 0这段代码");
                // 当 number == 0线程进入等待状态,并把锁释放
                System.out.println(Thread.currentThread().getName()+"：我正在执行wait（）方法，并且释放了锁");
                wait();
            }
            // 能进到这里说明number等于0,number--后不等于0
            number--;
            System.out.println("number - 1了,现在number的值是"+number);
            // 唤醒其他全部线程,告诉其他线程我减一了
            notifyAll();

            System.out.println(Thread.currentThread().getName()+" -> " + number);
            System.out.println("decrease()同步代码块走完了");
        }

    }


}
